package Demo2_13;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User：Lenovo
 * Date:2025-02-13
 * Time:20:42
 */
import java.util.Stack;

// 定义 MinStack 类，实现支持获取最小元素的栈
class MinStack {
    // 用于存储正常元素的栈
    private Stack<Integer> stack;
    // 用于存储当前栈中最小元素的栈
    private Stack<Integer> minStack;

    /**
     * 构造函数，初始化数据结构
     */
    public MinStack() {
        stack = new Stack<>();
        minStack = new Stack<>();
    }

    /**
     * 将元素 val 压入栈中
     * @param val 要压入的元素
     */
    public void push(int val) {
        stack.push(val);
        // 如果最小栈为空或者当前元素小于等于最小栈的栈顶元素，则将当前元素压入最小栈
        if (minStack.isEmpty() || val <= minStack.peek()) {
            minStack.push(val);
        }
    }

    /**
     * 删除栈顶元素
     */
    public void pop() {
        if (!stack.isEmpty()) {
            int popped = stack.pop();
            // 如果弹出的元素等于最小栈的栈顶元素，则将最小栈的栈顶元素也弹出
            if (popped == minStack.peek()) {
                minStack.pop();
            }
        }
    }

    /**
     * 获取栈顶元素
     * @return 栈顶元素
     */
    public int top() {
        return stack.peek();
    }

    /**
     * 获取栈中的最小元素
     * @return 栈中的最小元素
     */
    public int getMin() {
        return minStack.peek();
    }

// 主类，用于测试 MinStack 类的功能
    public static void main(String[] args) {
        // 创建 MinStack 实例
        MinStack minStack = new MinStack();
        // 向栈中压入元素 -2
        minStack.push(-2);
        // 向栈中压入元素 0
        minStack.push(0);
        // 向栈中压入元素 -3
        minStack.push(-3);
        // 输出当前栈中的最小元素，预期为 -3
        System.out.println("当前栈中的最小元素: " + minStack.getMin());
        // 弹出栈顶元素
        minStack.pop();
        // 输出当前栈顶元素，预期为 0
        System.out.println("当前栈顶元素: " + minStack.top());
        // 输出当前栈中的最小元素，预期为 -2
        System.out.println("当前栈中的最小元素: " + minStack.getMin());
    }
}
